var createError = require("http-errors");
var express = require("express");
var path = require("path");
var logger = require("morgan");
const _ = require("lodash")

var app = express();

// 设置模板的目录
app.set("views", path.join(__dirname, "views"));
// 设置使用art-template作为模板引擎，html后缀的文件为项目的模板
app.engine("html", require("express-art-template"));

app.use(logger("dev"));
// 注册session中间件
const session = require('express-session'); // 在app.js文件中进行配置
app.use(session({
    secret: 'kuaijiancms', //密钥，名字可以自己更改
    resave: false, // 默认值，不能更改
    saveUninitialized: true // 默认值，不能更改
}));
// 注册cookie中间件
const cookieParser = require("cookie-parser");
app.use(cookieParser());

// 接收post数据
app.use(express.json({
    limit: '50mb'
}));
app.use(express.urlencoded({
    extended: false,
    limit: '50mb'
}));

// 托管静态资源的目录
app.use(express.static(path.join(__dirname, "public")));


// 注册全局中间件：用于返回json数据
app.use(function(req, res, next) {
    //封装返回数据的函数
    res.cc = function(status = 200, msg = "成功", data = []) {
        if (data.length > 0) {
            res.json({
                status,
                msg,
                data,
            });
        } else {
            res.json({
                status,
                msg,
            });
        }
    };
    // 成功或者失败时的路由跳转
    res.jump = function(message, url, time = 2) {
        return res.render('message.html', {
            message,
            url,
            time
        })
    }

    // 判断用户是否登录了，如果登录了就放行，如果没有登录，就跳转到登录页面
    // 排除掉路由为login的路由，因为login路由没有设置session和cookie
    /*  if (req.url !== '/login') {
         if (!req.session.is_login && !req.cookies.is_login) {
             return res.jump('请先登录', '/login')
         }
     } */
    next()
});


// 路由模块
var loginRouter = require("./routes/login");
var indexRouter = require("./routes/index");
var cateRouter = require("./routes/cate");
var newsRouter = require("./routes/news");
app.use(loginRouter);
app.use(indexRouter);
app.use(cateRouter);
app.use(newsRouter);


// 错误中间件
const joi = require('joi')
app.use(function(err, req, res, next) {
    // 未知错误，通常表示服务器端的错误
    res.status(err.status || 500)
        // 数据验证失败
    if (err instanceof joi.ValidationError) {
        return res.cc(400, err.message)
    }
    // 接口异常
    res.cc(500, err.message)
        // 如果需要返回页面错误的页面信息
    res.render('error.html', {
        error: err.message
    });
});

module.exports = app;